package com.xcy.xcyrpc.utils;

import cn.hutool.core.util.StrUtil;
import cn.hutool.setting.dialect.Props;
import cn.hutool.setting.yaml.YamlUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

/**
 * 配置工具类
 */
public class ConfigUtils {

//    private static final Logger log = LoggerFactory.getLogger(ConfigUtils.class);

    /**
     * 加载配置对象
     *
     * @param tClass
     * @param prefix
     * @param <T>
     * @return
     */
    public static <T> T loadConfig(Class<T> tClass, String prefix) {
        return loadConfig(tClass, prefix, "");
    }

    /**
     * 加载配置对象，支持区分环境
     *
     * @param tClass
     * @param prefix
     * @param environment
     * @param <T>
     * @return
     */
//    public static <T> T loadConfig(Class<T> tClass, String prefix, String environment) {
//        StringBuilder configFileBuilder = new StringBuilder("application");
//        if (StrUtil.isNotBlank(environment)) {
//            configFileBuilder.append("-").append(environment);
//        }
//        configFileBuilder.append(".properties");
//        Props props = new Props(configFileBuilder.toString());
//        return props.toBean(tClass, prefix);
//    }


    /**
     * 支持读取 application.yml、application.yaml 等不同格式的配置文件。
     * @param tClass
     * @param prefix
     * @param environment
     * @return
     * @param <T>
     */

    public static <T> T loadConfig(Class<T> tClass, String prefix, String environment) {
        // 定义支持的扩展名优先级
        String[] extensions = {"yml", "yaml", "properties"};
        String baseName = "application" + (StrUtil.isNotBlank(environment) ? "-" + environment : "");

        // 优先级查找配置
        for (String ext : extensions) {
            String fileName = baseName + "." + ext;
            try {
                if ("properties".equals(ext)) {
                    // Properties 格式
                    Props props = new Props(fileName);
                    return props.toBean(tClass, prefix);
                } else {
                    // YAML 格式直接转 Map 后再转换为 Props
                    Map<?, ?> yamlMap = YamlUtil.loadByPath(fileName);
                    Props props = new Props();
                    props.putAll(yamlMap);
                    return props.toBean(tClass, prefix);
                }
            } catch (Exception ignore) {
                // 文件不存在或解析失败则跳过
            }
        }

        throw new RuntimeException("未找到配置文件: " + baseName + ".[yml|yaml|properties]");
    }

}
